home *** CD-ROM | disk | FTP | other *** search
/ The World of Computer Software / The World of Computer Software.iso / superopt.zip / RUN_PROG.DE < prev    next >
Text File  |  1992-11-21  |  6KB  |  146 lines

  1. /* Superoptimizer -- execute a instruction sequence to in order to
  2.    test it's correctness.
  3.  
  4.    Copyright (C) 1991 Free Software Foundation, Inc.
  5.  
  6.    This program is free software; you can redistribute it and/or modify it
  7.    under the terms of the GNU General Public License as published by the
  8.    Free Software Foundation; either version 2, or (at your option) any
  9.    later version.
  10.  
  11.    This program is distributed in the hope that it will be useful, but
  12.    WITHOUT ANY WARRANTY; without even the implied warranty of
  13.    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  14.    General Public License for more details.
  15.  
  16.    You should have received a copy of the GNU General Public License along
  17.    with this program; see the file COPYING.  If not, write to the Free
  18.    Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
  19.  
  20. int
  21. run_program(insn_t *sequence, int n_insns, word *regs)
  22. {
  23.   int pc;
  24.   insn_t insn;
  25.   word v, r1, r2;
  26.   int co, ci = -1;            /* Combine co and ci into cy?  */
  27.  
  28.   for (pc = 0; pc < n_insns; pc++)
  29.     {
  30.       insn = sequence[pc];
  31.       r1 = regs[insn.s1];
  32.       r2 = regs[insn.s2];
  33.  
  34.       switch (insn.opcode)
  35.     {
  36.     default:
  37.       fprintf(stderr,
  38.           "internal error: undefined instruction generated\n");
  39.       abort();
  40.  
  41.     case COPY:    PERFORM_COPY(v, co, r1, ci); break;
  42.     case EXCHANGE:
  43.       regs[insn.s1] = r2;
  44.       regs[insn.s2] = r1;
  45.       continue;
  46.  
  47.     case ADD:    PERFORM_ADD(v, co, r1, r2, ci); break;
  48.     case ADD_CI:    PERFORM_ADD_CI(v, co, r1, r2, ci); break;
  49.     case ADD_CO:    PERFORM_ADD_CO(v, co, r1, r2, ci); break;
  50.     case ADD_CIO:    PERFORM_ADD_CIO(v, co, r1, r2, ci); break;
  51.  
  52.     case SUB:    PERFORM_SUB(v, co, r1, r2, ci); break;
  53.     case SUB_CI:    PERFORM_SUB_CI(v, co, r1, r2, ci); break;
  54.     case SUB_CO:    PERFORM_SUB_CO(v, co, r1, r2, ci); break;
  55.     case SUB_CIO:    PERFORM_SUB_CIO(v, co, r1, r2, ci); break;
  56.  
  57.     case ADC_CI:    PERFORM_ADC_CI(v, co, r1, r2, ci); break;
  58.     case ADC_CO:    PERFORM_ADC_CO(v, co, r1, r2, ci); break;
  59.     case ADC_CIO:    PERFORM_ADC_CIO(v, co, r1, r2, ci); break;
  60.  
  61.     case CMP:    PERFORM_CMP(v, co, r1, r2, ci); break;
  62.     case CMPPAR:    PERFORM_CMPPAR(v, co, r1, r2, ci); break;
  63.  
  64.     case AND:    PERFORM_AND(v, co, r1, r2, ci); break;
  65.     case IOR:    PERFORM_IOR(v, co, r1, r2, ci); break;
  66.     case XOR:    PERFORM_XOR(v, co, r1, r2, ci); break;
  67.     case ANDC:    PERFORM_ANDC(v, co, r1, r2, ci); break;
  68.     case IORC:    PERFORM_IORC(v, co, r1, r2, ci); break;
  69.     case EQV:    PERFORM_EQV(v, co, r1, r2, ci); break;
  70.     case NAND:    PERFORM_NAND(v, co, r1, r2, ci); break;
  71.     case NOR:    PERFORM_NOR(v, co, r1, r2, ci); break;
  72.  
  73.     case AND_RC:    PERFORM_AND_RC(v, co, r1, r2, ci); break;
  74.     case IOR_RC:    PERFORM_IOR_RC(v, co, r1, r2, ci); break;
  75.     case XOR_RC:    PERFORM_XOR_RC(v, co, r1, r2, ci); break;
  76.     case ANDC_RC:    PERFORM_ANDC_RC(v, co, r1, r2, ci); break;
  77.     case IORC_RC:    PERFORM_IORC_RC(v, co, r1, r2, ci); break;
  78.     case EQV_RC:    PERFORM_EQV_RC(v, co, r1, r2, ci); break;
  79.     case NAND_RC:    PERFORM_NAND_RC(v, co, r1, r2, ci); break;
  80.     case NOR_RC:    PERFORM_NOR_RC(v, co, r1, r2, ci); break;
  81.  
  82.     case AND_CC:    PERFORM_AND_CC(v, co, r1, r2, ci); break;
  83.     case IOR_CC:    PERFORM_IOR_CC(v, co, r1, r2, ci); break;
  84.     case XOR_CC:    PERFORM_XOR_CC(v, co, r1, r2, ci); break;
  85.     case ANDC_CC:    PERFORM_ANDC_CC(v, co, r1, r2, ci); break;
  86.     case IORC_CC:    PERFORM_IORC_CC(v, co, r1, r2, ci); break;
  87.     case EQV_CC:    PERFORM_EQV_CC(v, co, r1, r2, ci); break;
  88.     case NAND_CC:    PERFORM_NAND_CC(v, co, r1, r2, ci); break;
  89.     case NOR_CC:    PERFORM_NOR_CC(v, co, r1, r2, ci); break;
  90.  
  91.     case LSHIFTR:    PERFORM_LSHIFTR(v, co, r1, r2, ci); break;
  92.     case ASHIFTR:    PERFORM_ASHIFTR(v, co, r1, r2, ci); break;
  93.     case SHIFTL:    PERFORM_SHIFTL(v, co, r1, r2, ci); break;
  94.     case ROTATEL:    PERFORM_ROTATEL(v, co, r1, r2, ci); break;
  95.     case LSHIFTR_CO:PERFORM_LSHIFTR_CO(v, co, r1, r2, ci); break;
  96.     case ASHIFTR_CO:PERFORM_ASHIFTR_CO(v, co, r1, r2, ci); break;
  97.     case SHIFTL_CO:    PERFORM_SHIFTL_CO(v, co, r1, r2, ci); break;
  98.     case ROTATEL_CO:PERFORM_ROTATEL_CO(v, co, r1, r2, ci); break;
  99.     case ROTATEXL_CIO:PERFORM_ROTATEXL_CIO(v, co, r1, r2, ci); break;
  100.     case ASHIFTR_CON:PERFORM_ASHIFTR_CON(v, co, r1, r2, ci); break;
  101.  
  102.     case EXTS1:    PERFORM_EXTS1(v, co, r1, r2, ci); break;
  103.     case EXTS2:    PERFORM_EXTS2(v, co, r1, r2, ci); break;
  104.     case EXTU1:    PERFORM_EXTU1(v, co, r1, r2, ci); break;
  105.     case EXTU2:    PERFORM_EXTU2(v, co, r1, r2, ci); break;
  106.  
  107.     case CLZ:    PERFORM_CLZ(v, co, r1, ci); break;
  108.     case CTZ:    PERFORM_CTZ(v, co, r1, ci); break;
  109.     case FF1:    PERFORM_FF1(v, co, r1, ci); break;
  110.     case FF0:    PERFORM_FF0(v, co, r1, ci); break;
  111.  
  112.     case ABSVAL:    PERFORM_ABSVAL(v, co, r1, ci); break;
  113.     case NABSVAL:    PERFORM_NABSVAL(v, co, r1, ci); break;
  114.  
  115.     case DOZ:    PERFORM_DOZ(v, co, r1, r2, ci); break;
  116.     case COMCY:    co = ci ^ 1; break;
  117.  
  118.     case CPEQ:    PERFORM_CPEQ(v, co, r1, r2, ci); break;
  119.     case CPGE:    PERFORM_CPGE(v, co, r1, r2, ci); break;
  120.     case CPGEU:    PERFORM_CPGEU(v, co, r1, r2, ci); break;
  121.     case CPGT:    PERFORM_CPGT(v, co, r1, r2, ci); break;
  122.     case CPGTU:    PERFORM_CPGTU(v, co, r1, r2, ci); break;
  123.     case CPLE:    PERFORM_CPLE(v, co, r1, r2, ci); break;
  124.     case CPLEU:    PERFORM_CPLEU(v, co, r1, r2, ci); break;
  125.     case CPLT:    PERFORM_CPLT(v, co, r1, r2, ci); break;
  126.     case CPLTU:    PERFORM_CPLTU(v, co, r1, r2, ci); break;
  127.     case CPNEQ:    PERFORM_CPNEQ(v, co, r1, r2, ci); break;
  128.  
  129.     case MUL:    PERFORM_MUL(v, co, r1, r2, ci); break;
  130.     case UMULWIDEN_HI: PERFORM_UMULWIDEN_HI(v, co, r1, r2, ci); break;
  131.     case INVDIV: PERFORM_INVDIV(v, co, r1, ci); break;
  132.     case INVMOD: PERFORM_INVMOD(v, co, r1, ci); break;
  133.  
  134. #ifdef UDIV_WITH_SDIV
  135.     case SDIV: PERFORM_SDIV(v, co, r1, r2, ci); break;
  136. #endif
  137.     }
  138.  
  139.       /* Store result.  */
  140.       regs[insn.d] = v;
  141.       ci = co;
  142.     }
  143.  
  144.   return ci;
  145. }
  146.